• 返回首页

        Vue2+Vue3教程——By Bug

        前言

        本笔记为站长学习过程中做的笔记内容,可能有遗漏或错误等,本笔记仅供参考,一切以官方文档为准,谢谢!

        笔记参考资料:

        前端最新Vue2+Vue3基础入门到实战项目全套教程_(哔哩哔哩)

        前端新版Vue2+Vue3基础入门到实战项目全套教程 (itheima.com)

        Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)

        vue基础案例接口 (apifox.com)

         

        Vue入门

        什么是Vue

        image-20250222223958579

        Vue的两种使用方式:

        1. Vue核心包开发 场景:局部模块改造

        2. Vue核心包&Vue插件工程化开发 场景:整站开发

         

        创建Vue实例

        安装

        安装 — Vue.js (vuejs.org)

        四个核心步骤:

        1. 准备容器

        2. 引包(开发版本/生产版本)

        3. 创建Vue实例(new Vue())

        4. 指定配置项→渲染数据

         

        插值表达式

        插值表达式是Vue的一种模板语法。

        作用:利用表达式进行插值,将数据渲染到页面中。

        语法:{{ 表达式 }}

        image-20250223141912568

        注意:

        1. 使用的数据必须存在

        2. 支持的是表达式,而不是语句:(if,for等不支持)

        3. 不能在标签属性中使用

         

        响应式特征

        数据响应式处理:数据变化时,视图自动更新

        数据访问及修改方法:实例名.属性=值

        例如:在下面的代码中,msg数据:abc先渲染到页面中,3秒之后变为123456并重新渲染到页面上

         

        Vue开发者工具安装

        浏览器Vue插件,使用插件可以方便快捷的修改数据

        image-20250223151347227

        在权限设置中开启允许访问文件地址

        将浏览器重启,插件生效。

        image-20250223151904349

         

        Vue指令

        Vue会根据不同的指令,针对标签实现不同的功能

        指令:带有v-前缀的特殊标签属性

         

        V-html

        和innerhtml作用相同,可以把标签内容动态解析到标签中

        插值表达式无法完成这个功能 当使用插值表达式插入标签时,会将标签以纯文本形式插入,而不会解析标签,如下所示

        image-20240708145739027

        如果使用v-html属性插入,如下所示

        image-20240708145956879

         

        V-show&&V-if

        这两个属性都是控制元素的显示和隐藏的。 其中V-if是条件渲染 当条件为true时显示,为false时隐藏元素

         

        V-show

        作用:控制元素的显示和隐藏 语法:v-show=”表达式“ 表达式值true显示,false隐藏 原理:相当于使用display:none来控制元素的显示和隐藏。 场景:适合频繁切换显示和隐藏的场景(例如:二级菜单等)

         

        V-if

        作用:控制元素的显示和隐藏 语法:v-if=”表达式“ 表达式值true显示,false隐藏 原理:根据条件控制元素的创建和移除来控制元素的显示和隐藏。 场景:要么显示,要么隐藏,不频繁切换的场景(例如:页面广告等)

         

        v-else&&v-else-if

        作用:辅助v-if进行判断渲染

         

        v-on

        作用:注册事件=添加时间监听+提供处理逻辑 语法:

        1. v-on:事件名=”内联语句“

        2. v-on:事件名=”methods中的函数名“

        3. 为了方便 v-on: 可简写为@

         

        内联语句

        实例:控制数字加减

         

        methods函数

        v-on调用传参

         

        案例:自动取款机

        image-20240709105406352

         

        v-bind

        作用:动态的设置html的标签属性(src,url,title等)

        语法:v-bind:属性名=“表达式” v-bind可以省略 直接写 :属性名=“表达式”

        例如:我们想要动态渲染img标签的图片地址,宽度等

        案例:图片轮播效果

        image-20240709105416289

        v-bind操作class

        语法::class="对象、数组"

        实例:为导航栏点击加背景颜色

        v-bind操作style

        语法::style="样式对象"

         

        v-for

        作用:基于数据循环,多次渲染整个元素 v-for支持:数组、对象、数字

        遍历数组语法: v-for=”(item,index) in 数组名“

        image-20240709105431410

        案例:书架

        image-20240709111816776

        v-for中的key

        语法::key=“唯一标识”

        作用:给列表添加唯一标识,便于Vue进行列表项的正确排序复用

        注意:

        1. key只能是字符串或数字类型

        2. key的值必须具有唯一性

        3. 推荐使用id作为key,不推荐使用数组下标

         

        v-model

        作用:给表单元素使用,双向绑定→可以快速或设置表单元素

        数据变化→视图自动更新 视图变化→数据自动更新

        语法:v-model="变量"

        实例:登录

        应用于其他表单元素

        常见的表单元素都可以用v-model绑定关联→快速设置和获取表单元素的值 它会根据控件的类型自动选取正确的方法,无需手动设置

        输入框:input:text——value 文本域:textarea——value 复选框:input:checkbox——checked 下拉菜单:select——value

         

        v-model原理

        原理本质上是一个语法简写,例如应用在输入框上,就是value属性和input事件的合写 作用:提供数据的双向绑定 数据变,视图跟着变 :value 视图变,数据跟着变 @input

        比如:子组件在设置下拉菜单传来的值时,是无法直接修改的,需要把v-model进行拆分

        v-model等价于 :value ——@input

        注意:$event用于在模板中,获取事件的形参

         

        v-model应用于组件

        像类似地址选择下拉菜单等常用的模块经常封装成组件,以便进行复用,这便会涉及到组件间的数据通信问题 image-20250302220923054

        实例:下拉菜单组件

         

        简化的代码:

         

        指令修饰符

        通过 “.” 指名一些指令的后缀,不同的后缀封装了不同的操作→简化代码

        1. 按键修饰符 @keyup.enter→键盘回车键监听

        2. v-model修饰符 v-model.trim→去除首尾空格 v-model.number→转数字

        3. 事件修饰符 @事件名.stop→阻止冒泡 @事件名.prevent→阻止默认行为

        4. 更多指令修饰符,见官方文档

         

         

        计算属性

        基于现有的数据,计算出来的新属性。依赖的数据变化,自动重新计算

        语法:

        1. 声明在computed配置项中,一个计算属性对应一个函数

        2. 使e'e'e'e方法和普通属性一样——{{ 计算属性名 }}

           

        实例:购物车统计

        image-20240710143641130

        computed和methods的区别 computed计算出结果后可以缓存,下次在使用时直接使用缓存数据,除非数据变了才会重新计算 methods每使用一次就会被调用一次

         

        计算属性的完整的写法

        计算属性的默认写法是只能访问,不能修改的。 若要想修改,需要使用计算属性的完整写法。

        语法如下:

        watch 侦听器

        作用:监视数据的变化,执行一些逻辑或异步操作 需求:翻译应用,左侧输入,右侧展示翻译结果

        语法:

        1. 简单写法

          实例:文本实时展示框

           

        2. 完整写法

          添加额外的配置项

          1. deep:true——对复杂类型深度监视

          2. immediate:true——初始化立即执行一次handler方法

           

        综合案例:笔记本

        image-20240709180547311

         

        综合案例:水果购物车

        image-20240710223203626

         

        Vue生命周期

        什么是生命周期

        Vue的生命周期:一个Vue实例从创建到销毁的整个过程

         

        生命周期的4个阶段

        1. 创建阶段

          • 只会执行一次

          • 将普通数据转换成响应式数据

        2. 挂载阶段

          • 只会执行一次

          • 渲染模板

        3. 更新阶段

          • 可以执行多次

          • 修改数据更新视图

        4. 销毁阶段

          • 销毁实例

           

        生命周期钩子

        生命周期函数 vue生命周期过程中,会自动运行一些函数,被称为【生命周期钩子】,可以让开发者在【特定阶段】运行自己的代码

        八个(4组)钩子函数

        1. before Create(创建阶段前)

        2. created(创建阶段后)——发送初始化渲染请求

        3. before Mount(挂载阶段前)

        4. mounted(挂载阶段后)——操作dom

        5. before Update(更新阶段前)

        6. updated(更新阶段后)

        7. before Destroy(销毁阶段前)——释放Vue外的资源(定时器等)

        8. destroyed(销毁阶段后)

         

        案例:记账本

        image-20240711154120642

        image-20240711154057856

        示例:渲染哔哩哔哩日榜

         

        工程化开发入门

        开发Vue的两种方式:

        1. 核心包传统开发模式:基于html/css/js文件,直接引l入核心包,开发Vue。

        2. 工程化开发模式:基于构建工具(例如:webpack)的环境中开发Vue。 源代码→自动化编译压缩组合→运行的代码

        工程化开发&&vue脚手架

        介绍: Vue CLI是vue官方提供的一个全局命令工具 它可以帮我们快速创建一个开发Vue项目的标准基础架子(集成了webpack配置)

        使用步骤

        1. 全局安装:yarn global add @vue/cli 或 npm i @vue/cli -g

        2. 查看vue版本:vue --version

        3. 创建项目架子:vue create 项目名(非中文) image-20250226103753230

          image-20250226103901714

        4. 启动项目:yarn serve 或 npm run serve(找到package.json配置serve启动名称) image-20250226104258364 启动成功

        image-20240711163328595

        脚手架目录文件介绍 image-20240711163500671

        image-20250226105614242

        组件化开发

        组件化:一个页面可以拆分成一个个组件,每个组件都有自己独立的结构,样式和行为。 优点:便于维护,利于复用,提升开发效率 组件类型:普通组件、根组件

        根组件:整个应用最上层的组件,包裹着所有普通的小组件

        image-20250226105951426

        image-20250226110356787

        App.vue文件(单文件组件)的三个组成部分

        1. 结构(template)--只有一个根节点

        2. 样式(style)--支持less,需要安装less和less-loader

          1. 给style加上lang="less"

          2. 安装依赖包

        3. 行为(script)

        默认情况下,编译器无法对vue文件代码进行高亮显示,需要安装以下插件

        image-20250226110644808

        组件注册

        普通组件的局部注册

        局部注册:只能在注册的范围内部使用

        1. 创建.Vue文件(三个组成部分),在components目录中创建 image-20250226111946747

        2. 在使用的组件内导入并注册

        注意:组件名使用大驼峰命名法

        语法:

        使用: 直接将组件名当作HTML标签使用即可。即:<组件名></组件名>

         

        示例:完成下面的效果图

        image-20250226170619788

        代码展示:

         

        普通组件的全局注册

        全局注册:所有组件内部都可以使用

        1. 创建.vue文件

        2. main.js进行全局注册

        使用方法和局部注册方法相同,作为HTML标签使用

         

        渲染组件内容

        首先,在 data 中准备渲染的数据:

        然后,在模板中使用 v-for 渲染这些数据:

        LittleBox 组件中,你可以通过 props 来接收数据:

        最后,在 LittleBox 组件的模板中显示数据:

        这样,就可以通过 v-for 动态渲染数据到多个 LittleBox 组件中了

         

        scoped样式冲突

        全局样式(默认):会影响所有组件,会造成多个组件之间的样式冲突问题

        局部样式:scoped下的样式,只作用于当前组件,为style标签加上scoped属性

        scoped原理:

        1. 当前组件内的标签都被添加了data-v-hash值的自定义属性

        2. css选择器也被添加了该自定义属性

        效果:必须是当前组件的元素,才会有这个自定义属性,样式才会被生效

         

        data函数

        一个组件的data选项必须是一个函数。→保证每一个组件实例,维护独立的一份数据对象。

        语法如下:

         

        组件通信

        组件通信即组件与组件之间的数据传递

        组件通信解决方案

        父子关系:props 和 $emit 非父子关系:provide 和 inject eventbus 通用解决方案:Vuex(适合复杂业务场景)

        组件通信语法

        父传子

        image-20240712143651355

        子传父

        image-20240712145201270

         

        非父子通信

        image-20250302200845459

         

         

        provide 和 inject 实现跨层级的数据共享,即在顶层元素中提供一组数据,使得子孙后代中的所有数据都可以访问到

        在父组件provide中提供数据

        在子孙组件中接收

        image-20250302201545286

        prop详解

        什么是prop? 组件上注册一些自定义属性

        prop作用:向子组件传递数据

        特点:

        image-20250228141713586

        prop校验

        作用:为组件的prop指定验证要求,不符合要求的,控制台会显示错误提示,帮助开发者快速发现错误

        四种校验:

        1. 类型校验

        2. 非空校验

        3. 默认值校验

        4. 自定义校验

        语法:

        完整写法

        prop&data、单向数据流 共同点:都可以给组件提供数据。 区别:

        1. data的数据是自己的>随便改

        2. prop 的数据是外部的→不能直接改,要遵循单向数据流

        单项数据流,父组件数据更新,会单项向下流动,影响子组件,这个数据流动是单向的

         

         

        实例:商品数量加减

         

        实例:小黑记事本组件版

         

        进阶语法

        sync修饰符

        作用:实现子组件和父组件的双向绑定,简化代码

        特点:prop属性名可以自定,非固定为value

        本质::属性名 和 @update:属性名 的合写

         

        ref和$refs

        作用:利用ref和$refs可以获取dom元素和组件实例

        特点:查找范围--当前组件内(更加精准)

        1. 获取dom

          1. 目标标签--为目标标签添加ref属性

          2. 在恰当时机(dom元素渲染完成后 )时,可以通过this.$refs.name的方法获取目标标签

        2. 获取组件实例

          1. 目标组件--为目标组件添加ref属性

          2. 在恰当时机(dom元素渲染完成后 )时,可以通过this.$refs.name.组件方法() 获取目标组件方法

         

        $nextTick、Vue异步更新

        $nextTick:等待DOM元素更新完成之后,才会触发执行此方法内部的函数

        语法:

        需求:点击编辑标题,编辑框自动聚焦

         

        自定义指令

        之前的(v-model,v-html,v-for,等)称为内置指令

        自定义指令:自己定义的,封装了一些dom操作,扩展额外功能的指令

        自定义指令可以应对更加复杂的场景

         

        基本语法

        局部注册(封装获取焦点的自定义指令)

        inserted(),当元素被插入到页面时触发

        全局注册

        使用:

         

        指令的值

        需求:实现一个color指令——传入不同的颜色,给标签设置不同的文字颜色

        语法:在绑定指令时,通过 ’=‘ 的形式作为指令 绑定 具体的参数值

        通过binding.value可以拿到指令的值,指令值修改会触发update函数

        v-color指令的封装

        案例:输入框输入一个颜色,修改字体颜色

        练习:封装v-loading指令

        场景:实际开发过程中,发送请求需要时间,在请求的数据未回来时,页面会处于空白状态=>用户体验不好

        需求:封装一个v-loading指令,实现加载中的效果

        分析:

        1. 本质loading效果就是一个蒙层,盖在了盒子上

        2. 数据请求中,开启loading状态,添加蒙层

        3. 数据请求完毕,关闭loading状态,移除蒙层

         

        实现:

        1. 准备一个loading类,通过伪元素定位,设置宽高,实现蒙层

        2. 开启关闭loading状态(添加移除蒙层),本质只需要添加移除类即可

        3. 结合自定义指令的语法进行封装复用

        封装v-loading

         

        插槽

        作用:可以让组件内部的一些结构支持自定义

        需求:一个弹窗提示框,结构相同,内容不同,希望内容部分支持自定义

         

        默认插槽

        插槽的基本语法:

        1. 组件内需要定制的结构部分,改用<slot></slot>进行占位

        2. 在使用组件时,<组件></组件>标签内部,传入结构替换slot

        image-20240713142510303

         

        后备内容(插槽默认值)

        通过插槽完成内容的定制,传入什么内容就显示什么内容。如果什么都不显示,则是空白内容。影响效果,所以为插槽要设置默认内容

        插槽后背内容:封装组件时,可以为<slot>插槽提供后备内容

        image-20240713143309321

        image-20240713143213886

        image-20240713143344488

        image-20240713143333388

         

        具名插槽

        在开发中,一个组件内部可能有多处结构,需要传入多个内容进行定制。默认问题无法满足需求,需要使用具名插槽。

        语法:

        1. 多个slot使用name属性区分名字

        2. 使用 <template v-slot:name></template>传入对应的值

        image-20240713144827470

        注意:v-slot:name可以简写为#name

         

        作用域插槽

        作用域插槽是插槽的一个传参语法,并不属于插槽的分类

        作用域插槽:定义slot插槽的同时是可以传值的。给插槽上可以绑定数据,将来使用组件时可以用

        应用场景:封装表格组件。如图 image-20240714200223580

        1. 父传子,动态渲染表格内容

        2. 使用默认插槽,定制操作列

        3. 删除或查看都需要用到当前项的ID,属于组件内部的数据通过作用域插槽传值绑定,进而使用。

        基本使用步骤:

        1. 给solt标签,用添加属性的方式传值

        2. 所有添加的属性,都会被收集到一个对象中。

        3. 在template中,通过‘ #插槽名=“boj” ’的方法接收,默认插槽名为default

           

         

        路由

        单页应用程序

        SPA-Single Page Application

        所有功能都在一个html页面实现

        例如:网易云音乐官网

        类型实现方式页面性能开发效率体验首屏加载SEO
        单页一个html页面按需更新
        性能高
        很好
        多页多个html页面整页更新
        性能低
        一般

         

        两种网站的应用场景

        单页面应用程序,之所以开发效率高,性能高,用户体验好 最大的原因就是:页面按需更新

         

        路由概念

        单页面应用需要按需更新,首先要明确:访问路径和组件的对应关系

        Vue中的路由:反映 路径和组件的映射关系

         

        vueRouter(插件)基本使用

        vue官方的路由插件,是一个第三方插件包 官方文档:介绍 | Vue Router (vuejs.org)

        作用:修改地址栏路径时,切换显示匹配的组件

        使用步骤(main.js中的操作)(5+2)

        5个基础步骤

        1. 下载模块(vue2使用3.6.5版本)

        2. 引入

        3. 安装注册

        4. 创建路由对象

        5. 注入,将路由对象注入到new vue实例中,建立关联

          完成后可以看到地址栏出现(/#/),即为安装成功 image-20240715123539449

         

        2个核心步骤

        1. 创建需要的组件(views)目录,配置路由规则 image-20240715134722551

        2. 配置导航,配置路由出口(路径匹配的组件显示的位置)

           

        组件目录存放

        组件分类的主要目的:更加便于维护

        .vue文件分2类;页面组件&复用组件

         

        路由模块封装

        所有路由配置都堆在main.js中不合适,需要将路由模块抽离出来,拆分的模块更加利于维护

        将原来main.js中的路由配置信息写到一个新的js文件中(如:index.js)

        image-20250308112611559

         

        声明式导航&导航高亮

        导航高亮

        需求:实现导航高亮

        vue-router提供了一个全局组件,用于取代a标签

        特点:

        当元素被选中时,会自动添加class属性

        image-20240715165854352

        可以通过这两个属性为导航元素添加高亮属性

        image-20250308114213829

         

        两个类名的作用

         

        自定义高亮类名

        在创建对象时使用 linkActiveClass: '类名1', linkExactActiveClass: '类名2',配置 模糊匹配类名 和 精准匹配类名

        image-20240715190424155

        跳转传参

        目标:在跳转路由时进行传值

        方法1:查询参数传参

        1. 语法格式如下: to='/路径?参数名=值&参数名=值...'

        2. 取得传过来的值 $route.query.参数名 在created等函数中,使用该值需要使用this.$route.query.参数名取值

         

        方法2:动态路由传参

        1. 配置动态路由,path: '/路径/:words'(:不能省略)

           

        2. 配置导航链接

        3. 对应页面组件接收传递过来的值

         

        动态路由参数可选符

        注意:该参数表示必传参数,若不传入参数,就无法匹配到页面,因此可以加可选符‘?’

         

        两种传参方式的区别

        1. 查询参数传参 (比较适合传多个参数) ①跳转:to="/path?参数名=值&参数名2=值 ②获取:$route.query.参数名

        2. 动态路由传参(优雅简洁,传单个参数比较方便) ①配置动态路由:path:"/path/参数名 ②跳转:to="/path/参数值" ③获取:$route.params.参数名

         

        VUE路由重定向

        网页打开时,url默认是 /路径,未匹配到组件时,会出现网页空白问题,影响体验

        重定向:匹配到某一路径后,强制跳转到path路径。

        语法:{path:匹配的路径,redirect:重定向的路径}

         

        路由404

         

        路由模式

        编程式导航

        需求:点击按钮实现跳转效果。

        编程式导航:使用js代码进行跳转 image-20250309150059141

         

        两种语法:

        1. path路径跳转(简单方便)

        2. name命名路由跳转,适合path路径长的场景 首先要为路由起名字

           

        编程式导航传参

        编程式导航的两种语法均支持查询参数传参路由传参

        传参语法见: 声明式导航传参方法

        动态路由传参

         

        一级路由与二级路由

        在一级路由中使用children关键字配置嵌套子路由

         

        组件缓存keep-alive

        需求:一个网站文章列表有大量文章,当点开一篇文章再返回文章列表时,希望从刚刚的位置继续浏览,而不是从头开始

        路由跳转特点:路由跳转后,组件被销毁了,返回回来组件又被重建了,所以数据重新被加载了

        解决:利用keep-alive将组件缓存下来

        Keep-alive介绍

        1. keep-alive是什么

          • keep-alive是Vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

          • keep-alive是一个抽象组件:它自身不会渲染成一个DOM元素,也不会出现在父组件链中。

        2. keep-alive的优点

          • 在组件切换过程中把切换出去的组件保留在内存中,防止重复渲染DOM,

          • 减少加载时间及性能消耗,提高用户体验性。

         

        问题:使用<keep-alive>缓存了所有被包裹的一级(同级)路由组件,而内部的有些组件我们并不希望被缓存

        可以使用下面的属性进行配置

        keep-alive的三个属性

        1. include:组件名数组,只有匹配的组件会被缓存

        2. exclude:组件名数组,任何匹配的组件都不会被缓存

        3. max:最多可以缓存多少组件实例

         

        被缓存的组件会多两个生命周期钩子:

         

        自定义创建项目

        基于VueCli自定义创建项目架子

        创建项目

        安装脚手架→创建项目→选择自定义

        image-20240716165117141

        选择项目 babel、router、css、linter

        image-20240716165327538

        image-20240716165440149

        image-20240716165550327

        等待项目创建完成......

         

        ESlint代码规范

        代码规范:一套写代码的规则。

        手动修正代码规范

        根据错误提示的位置,一项一项进行手动修正。

        可以在EsLint规则表中查找错误含义

        自动修正代码规范

        基于vscode插件ESlint高亮错误,并配置自动修复错误 image-20240716171714579

        image-20250311113330769

        添加vs code配置

        image-20240716171747567

         

        vuex

        vuex:是一个状态(数据)管理工具,管理vue通用数据(多组件共享的数据)

         

        使用场景

        1. 某个状态在很多组件中都要使用(个人信息)

        2. 多个组件共同维护一份数据(购物车信息)

        优势:

        1. 共同维护了一份数据,数据集中化管理

        2. 响应式变化

        3. 操作简捷(vuex提供了一些辅助函数)

         

        使用方法

        1. 基于脚手架创建项目,构建多组件共享数据环境 创建一个根组件和两个子组件

        2. 创建一个空仓库

          • 安装vuex

          • 新建vuex模块文件 在store文件夹下创建index.js,存放vuex

          • 创建仓库 Vue.use(Vuex) 创建仓库new Vuex.Store()

          • main.js导入挂载

             

           

        3. 提供、访问vuex数据

          • 提供数据——在创建的仓库内添加store配置对象

          • 使用store直接 访问数据——this.$store

            • 在模板中:{{ $store.state.dea }}

            • 在组件逻辑内:this.$store.state.dea

            • 在JS模块内:store.state.dea

            image-20240717141250511

            所有组件都可以使用到仓库有内部的数据

          • 通过辅助函数 mapState是辅助函数,可以帮我们把store中的数据自动映射到组件的计算属性中。

         

        修改数据

        mutations

        state中的数据不能直接修改,需要使用mutations

        目标:明确vuex同样遵循单向数据流,组件中不能直接修改仓库的数据

        通过strict:true可以开启严格模式(有利于初学者检测不规范的代码,但上线时需要移除,会消耗服务器性能)

        1. 定义mutations对象,对象中存放了修改state的方法 所有mutations函数的第一个形式参数都是state

        2. 在组件中使用定义的方法

        3. 在组件传参

           

         

        mapMutations

        辅助函数mapMutations,映射方法,和mapstate相似,它是把位于Mutations中的方法提取出来,映射到组件methods中 在函数中可以使用this.方法名调用

         

        actions

        actions:处理异步操作 需求:1秒之后,修改xxx数据

        使用方法:

        1. 提供actions方法

        2. 在页面中调用(dispatch)

        实例:一秒修改一次数值

        辅助方法mapAcitons,映射方法 mapAcitons把位于actions中的方法提取处理,映射到组件methods中

         

        getter

        作用:类似于计算属性 除了state之外,还要从state中派生出一些状态,这些状态都是依赖state的,此时会用到getters 例如: 在state中定义一个list数组,存储1-10的数据,在组件中显示所有大于5的数据

        定义getters

        1. getters的第一个形参必须是state

        2. getters函数必须有返回值

        访问getters

        1. 通过store访问

        2. 使用辅助函数mapgetters映射

         

        分模块开发module

        由于vuex使用单一状态树,应用的所有状态都集中到一个较大的对象中。当应用非常复杂时,store对象就会变得非常臃肿,难以维护。

        模块拆分

        1. 新建文件夹 store/modules

        2. 在modules文件夹下新建模块的js文件

        1. 将模块挂载到index.js(store)

        2. 访问子模块中的数据

          • 直接使用模块名访问:$store.state.模块名.xxx

          • 通过默认的mapState[xxx,xxx])映射访问 mapState("子模块名",[xxx,xxx]),需要在导出项中开启命名空间,namespaced: true

          • getters中的数据访问方式

            1. 通过模块名访问:$store.getters["模块名/xxx"]

            2. 通过mapGetters映射获取

              • 默认根级别映射:mapGetters(["xxx"])

              • 子模块映射:mapGetters('模块名',['xxx','xxx'])

          • mutations,actions的使用

            注意:模块中的mutations,actions默认会被挂载到全局,需要开启命名空间,才会挂载到子模块中

            • mutations调用

              1. 直接通过模块名调用:$store.commit("模块名/xxx",额外参数)

              2. 通过mapMutations映射

                根级别:mapMutations(['xxx'])

                子模块级别:mapMutations("模块名",['xxx'])

            • actions调用方法和mutations调用方法相同

              • 直接通过模块名调用:$store.dispatch("模块名/xxx",额外参数)

              • mapAcitons辅助函数导入

         

        扩展:快速获得一个增删改查的API

        可以使用json-server工具

        json-server - npm

        安装

        启动

         

         

        Vue3新特性

        Vue.js - 渐进式 JavaScript 框架 | Vue.js

        Vue3优势

         

        Create-vue

        create-vue是Vue官方新的脚手架工具,底层切换到了vite(下一代构建工具),为开发提供极速响应| image-20250314153316408

         

        使用Create-vue创建项目

        1. npm init vue@latest,并输入项目名称 image-20250314160226584

        2. 选择模块 image-20250314160301676

        3. 选择完成后进行项目初始化,完成后启动项目

          image-20250314160334796

        4. 启动成功! image-20250314160439234

          image-20250314160108272

         

        Vue3目录

        image-20250314160615881

        image-20250314160736114

        安装Vue3插件

        image-20250314161401086

        image-20250314161609490

         

        组合式API

        setup选项

        setup的特点

        1. setup执行时机早于beforecreate

          image-20250314162810434

        2. setup中获取不到this

          image-20250314163017199

        3. setup中的数据和函数必须return才能使用

          image-20250314163603313

        简化setup写法

        <script setup>语法糖

        简化写法示例:

         

        reactive&ref函数

        reactive函数

        作用:接受对象类型数据的参数传入并返回一个响应式的对象

        语法

        1. 从vue包中导入reactive函数

        2. <script setup>中执行reactive函数并传入类型为对象的初始值,并使用变量接收返回值

         

        ref函数

        reactive函数需要接受对象类型的数据,而对于简单类型的数据无法进行处理,可以使用ref函数进行处理

        作用:接收简单类型或者对象类型的数据传入并返回一个响应式的对象

        语法:

        注意点:

        1. 脚本中访问数据,需要通过.value

        2. 在template中,.value不需要加

         

        computed

        computed计算属性函数 计算属性基本思想和Vue2的完全一致,组合式API下的计算属性只是修改了写法

        语法:

        最佳实践

        1. 计算属性中不应该有“副作用" 比如异步请求/修改dom

        2. 避免直接修改计算属性的值 计算属性应该是只读的,特殊情况可以配置get,set

         

        watch

        作用:侦听一个或者多个数据的变化,数据变化时执行回调函数

         

        语法:

        监听一个值的变化

        监听多个值的变化

         

        两个额外参数:

        1. immediate(立即执行)

        2. deep(深度侦听)

          默认watch进行的是浅层监视 constref1=ref(简单类型)可以直接监视 constref2=ref(复杂类型)监视不到复杂类型内部数据的变化

         

        精确侦听对象的某个属性

         

        生命周期函数

        在VUE3中也支持选项式API,但更推荐使用组合式API

        生命周期函数如下:

        选项式API组合式API
        beforeCreate/createdsetup
        beforeMountonBeforeMount
        mountedonMounted
        beforeUpdateonBeforeUpdate
        updatedonUpdated
        beforeUnmountonBeforeUnmount
        unmountedonUnmounted

         

        父子通信

        父传子

        基本思想 1.父组件中给子组件绑定属性 2.子组件内部通过props选项接收

        语法:

        image-20250315164657931

        注意:由于写了setup,所以无法直接配置props 选项 所以:此处需要借助于“编译器宏”函数(defineProps)接收子组件传递的数据

         

        子传父

        基本思想

        1. 父组件中给子组件标签通过@绑定事件

        2. 子组件内部通过emit方法触发事件

        语法:

        image-20250315170423245

         

        模板引用

        通过ref标识获取真实的dom对象或者组件实例对象

        步骤:

        1. 调用ref函数生成一个ref对象

        2. 通过ref标识绑定ref对象到标签

        语法:

         

        defineExpose宏函数

        默认情况下在<script setup>语法糖组件内部的属性和方法是不开放双给父组件访问的, 可以通过defineExpose()编译宏指定哪些属性和方法允许访问

        语法:

         

        provide和inject跨层级通信

        作用和场景 顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信

        跨层传递普通数据

        1. 顶层组件通过provide函数提供数据

        2. 底层组件通过inject函数获取数据

        image-20250315172827653

         

        新特性

        defineOptions

        背景说明: <script setup>之前,如果要定义 props,emits 可以轻而易举地添加一个与 setup 平级的属性。 但是用了<script setup>后,就没法这么干了setup属性已经没有了,自然无法添加与其平级的属性。

        为了解决这一问题,引入了 defineProps 与defineEmits 这两个宏。但这只解决了props 与 emits 这两个属性。 如果我们要定义组件的name 或其他自定义的属性,还是得回到最原始的用法一再添加一个普通的<script>标签。 这样就会存在两个<script>标签。让人无法接受。

        所以在Vue3.3中新引入了defineOptions宏。顾名思义,主要是用来定义OptionsAPI的选项。可以用defineOptions定义任意的选项,props,emits,expose,slots除外(因为这些可以使用definexxx来做到)

         

        defineModel

        在Vue3中,自定义组件上使用v-model,相当于传递一个modelValue属性,同时触发update:modelValue 事件

        image-20250315195022061

         

        语法:

        image-20250315195805659

         

        Pinia

        介绍

        什么是Pinia

        Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话,你可能会认为可以通过一行简单的 export const state = reactive({}) 来共享一个全局状态。对于单页应用来说确实可以,但如果应用在服务器端渲染,这可能会使你的应用暴露出一些安全漏洞。 而如果使用 Pinia,即使在小型单页应用中,你也可以获得如下功能:

        Pinia相对于Vuex的优势

        1. 提供更加简单的APl(去掉了mutation)

        2. 提供符合,组合式风格的API(和Vue3新语法统一)

        3. 去掉了modules的概念,每一个store都是一个独立的模块

        4. 配合TypeScript更加友好,提供可靠的类型推断

         

        安装Pinia

        在实际开发项目的时候,关于Pinia的配置,可以在项目创建时自动添加

        开始 | Pinia

        手动配置方法

        1. 安装

        2. 将pinia导入到项目

           

        使用Pinia

        定义store仓库

        Pinia既支持选项式API也支持组合式API,但更推荐使用组合式API编写

        语法:

        Setup Store 中:

        注意,要让 pinia 正确识别 state,你必须在 setup store 中返回 state 的所有属性。这意味着,你不能在 store 中使用私有属性。不完整返回会影响 SSR ,开发工具和其他插件的正常运行。

         

        使用仓库

        action异步写法

        image-20250316152336901

         

        storeToRefs方法

        导入的store如果不做处理,直接进行解构时,会导致数据丢失响应式,可以使用storeToRefs进行处理

        示例:

         

         

        持久化

        Pinia持久化插件

        官网:Pinia Plugin Persistedstate

        官方文档:开始 | Pinia Plugin Persistedstate

        安装

        1. 用您喜欢的软件包管理器安装依赖项:

        2. 将插件添加到你的 pinia 实例中:

        用法

        在声明您的store时,请将新persist选项设置为 true

        相关自定义配置可参考官方文档

         

         

         

        end

        笔记知识点部分到此结束,下面是项目记录部分

         

        Vue2项目:智慧商城

        接口文档:wiki - 智慧商城-实战项目

        创建项目

        配置步骤

        安装脚手架

        创建项目

        自定义配置

        Babel/Router/Vuex/CSs/Linter

        Vue2.x

        VueRouterhash模式

        CSS预处理Less

        ESlint:Standard & Lint on Save

        配置文件dedicated configfiles

        image-20250316191431526

        image-20250316191526255

        完成 image-20250316191745971

         

        调整项目目录

        目标:将目录调整成符合企业规范的目录

        image-20250316204831206

        1. 删除多余的文件

        2. 修改路由配置和App.vue

        3. 新增两个目录api/utils

          ①api接口模块:发送ajax请求的接口模块 ②utils工具模块:自己封装的一些工具方法模块

         

        vant组件库

        认识第三方Vue组件库vant-ui

        组件库:第三方封装好了很多很多的组件整合到一起就是一个组件库。

        官方文档:Vant Doc | 组件 中文文档 documentation | v2.13.2 v2.0 v2.x | Vant UI (for vue 2.0) | Vue UI Component for mobile phone | Vant js

         

        了解其他Vue 组件库 Vue的组件库并不是唯一的,vant-ui也仅仅只是组件库的一种。 一般会按照不同平台进行分类:

         

        安装组件库

        通过 npm 安装

        通过 CDN 安装

         

        将组件库引入到项目

         

        VW适配解决

        基于postcss插件实现项目vw适配

        PostCSS - 是一个用 JavaScript 工具和插件来转换 CSS 代码的工具 | PostCSS中文网

        进阶用法 Doc | 组件 中文文档 documentation | v2.13.2 v2.0 v2.x | Vant UI (for vue 2.0) | Vue UI Component for mobile phone | Vant js

        安装插件

        PostCSS 示例配置

        下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。

        image-20250316220846830

         

        路由设计和配置

        分析项目页面,设计路由,配置一级路由 但凡是单个页面,独立展示的,都是一级路由

        搭建目录结构

        image-20250317103546570

         

        image-20250317135810919

        配置路由模块

         

        使用vant编写底部标签栏,配置二级路由(layout/index)

        image-20250317171633535

        基于底部导航,配置二级路由

        image-20250317173139489

        image-20250317173125608

        路由模式

        标签栏支持路由模式,用于搭配 vue-router 使用。路由模式下会匹配页面路径和标签的 to 属性,并自动选中对应的标签。

         

        登陆页及图形验证码

        编写静态页面

        image-20250317182424385

         

        封装请求

        目标:将axios请求方法,封装到request模块 使用axios来请求后端接口,一般都会对axios进行一些配置(比如:配置基础地址,请求响应拦截器等) 所以项目开发中,都会对axios进行基本的二次封装,单独封装到一个request模块中,便于维护使用

        https://www.axios-http.cn/docs/

        在utils中新建一个request.js,添加以下配置

        请求验证码

        需求: 1.动态将请求回来的base64图片,解析渲染出来 2.点击验证码图片盒子,要要刷新验证码

        image-20250317185029197

         

        将请求封装成API接口

        image-20250317193625257

        封装api模块的好处:

        1. 请求与页面逻辑分离

        2. 相同的请求可以直接复用

        3. 请求进行了统一管理

         

        Toast轻提示

        阅读vant组件库文档,掌握toast轻提示

        image-20250317193856901

         

        短信验证请求和登录

        步骤分析: 1.点击按钮,实现倒计时效果 2.倒计时之前的校验处理(手机号、验证码) 3.封装短信验证请求接口,发送请求添加提示

        验证方法

        登录逻辑与上方类似

         

        响应拦截器统一处理错误

        问题:每次请求,都会有可能会错误,就都需要错误提示 说明:响应拦截器是拿到数据的第一个数据流转站,可以在里面统一处理错误。

        image-20250317213300094

         

         

        登录权证信息存储

        目标:vuex构建user模块存储登录权证(token&userld)

        说明:

        1. token存入vuex的好处,易获取,响应式

        2. vuex需要分模块=>user模块status

        image-20250317213613860

        vuex user模块配置示例

         

        vuex持久化

        封装storage存储模块,利用本地存储,进行vuex持久化处理

         

         

         

         

        endend2